//package com.ruoyi.framework.mybatis;
//
//import com.github.pagehelper.PageInterceptor;
//import com.ruoyi.common.core.domain.entity.SysUser;
//import com.ruoyi.common.utils.ShiroUtils;
//import com.ruoyi.common.utils.StringUtils;
//import org.apache.ibatis.cache.CacheKey;
//import org.apache.ibatis.executor.Executor;
//import org.apache.ibatis.mapping.BoundSql;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.plugin.*;
//import org.apache.ibatis.session.ResultHandler;
//import org.apache.ibatis.session.RowBounds;
//import org.springframework.beans.factory.annotation.Autowired;
//
//import java.lang.reflect.Field;
//import java.util.Properties;
//
///**
// * mubatis拦截器  拦截sql的执行
// */
////@Component
//@Intercepts(
//        {
//                @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
//                @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),
//        }
//)
//public class MybatisInterceptor implements Interceptor {
//
//    /**
//     * 进行拦截的时候要执行的方法
//     *
//     * @param invocation
//     * @return
//     * @throws Throwable
//     */
//    @Override
//    public Object intercept(Invocation invocation) throws Throwable {
//        System.out.println("====intercept======");
//
//        Object[] args = invocation.getArgs();
//        MappedStatement mappedStatement = (MappedStatement) args[0];
//        Object parameter = args[1];
//        RowBounds rowBounds = (RowBounds) args[2];
//        ResultHandler resultHandler = (ResultHandler) args[3];
//        Executor executor = (Executor) invocation.getTarget();
//        CacheKey cacheKey;
//        BoundSql boundSql;
//
//        //由于逻辑关系，只会进入一次
//        if (args.length == 4) {
//            //4 个参数时
//            boundSql = mappedStatement.getBoundSql(parameter);
//            cacheKey = executor.createCacheKey(mappedStatement, parameter, rowBounds, boundSql);
//        } else {
//            //6 个参数时
//            cacheKey = (CacheKey) args[4];
//            boundSql = (BoundSql) args[5];
//        }
//
//        //id为执行的mapper方法的全路径名，如com.metro.dao.UserMapper.insertUser
//        String id = mappedStatement.getId();
//        //获取到原始sql语句
//        String sql = boundSql.getSql();
//
//
//        String newSql = "$#####";//修改后的sql
//        if (StringUtils.containsAny(id, "insert", "update")) {
//            setCommonProperties(id, sql);
//        }
//        newSql = sql;
//
//        //通过反射修改boundSql对象的sql语句
//        Field field = boundSql.getClass().getDeclaredField("sql");
//        field.setAccessible(true);
//        field.set(boundSql, newSql);
//
//        //执行修改后的sql语句
//        return executor.query(mappedStatement, parameter, rowBounds, resultHandler, cacheKey, boundSql);
//
//        //执行结果
//        //return invocation.proceed();
//    }
//
//    private void setCommonProperties(String statementId, String sql) {
//        SysUser sysUser = ShiroUtils.getSysUser();
//        sysUser.getUserId();
//        sysUser.getDept();
//        // modify sql
//        // id, oldsql
//        if (StringUtils.containsAny(statementId, "insert")) {
////            sql.replace(")")
//            sql = sql.replace("create_by,", "").replace("create_time", "");
//            sql = sql.replace(")values", "create_by, create_time, create_by_id )values");
//
//        }
//    }
//
//    @Override
//    public Object plugin(Object target) {
//        return Plugin.wrap(target, this);
//    }
//
//    @Override
//    public void setProperties(Properties properties) {
//    }
//
//}
//
//